﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace mrp16062010
{
    class IleriYukle
    {
        public string Id { get; set; }
        public static int nesneSayac;
        Cizelge cizelge;
        Rota.RotaParcasi rota;
        public Tarih tarih = new Tarih();//Tüm rotanın yüklendikten sonra tarih aralığını verir
        int grupNo;
        private Tarih yuklemeTarihi = new Tarih();
        private List<GeriYukle> geriYuklemeler = new List<GeriYukle>();

        public Tarih YuklemeTarihi
        {
            get { return yuklemeTarihi; }
            set { yuklemeTarihi = value; }
        }

        private Siparis siparisBilgi;

        public Siparis SiparisBilgi
        {
            get { return siparisBilgi; }
            set { siparisBilgi = value; }
        }
        
        

        public IleriYukle(Cizelge gelenCizelge, Siparis gelenSiparis)
        {
            
            siparisBilgi = gelenSiparis;
            yuklemeTarihi.BaslangicTarihi = gelenSiparis.TarihBilgisi.BaslangicTarihi;
            //sayaç diye bi nesne yap
            mrp16062010.Yukle.sayac++;
            grupNo = mrp16062010.Yukle.sayac;
            cizelge = gelenCizelge;
            rota = siparisBilgi.Rota;
            tarih.BaslangicTarihi = gelenSiparis.TarihBilgisi.BaslangicTarihi;
            Tarih sonTarihHali = new Tarih();
            sonTarihHali.BaslangicTarihi = gelenSiparis.TarihBilgisi.BaslangicTarihi;
            tarih = IlkYukleme(rota, 0,sonTarihHali);
            yuklemeTarihi.BitisTarihi = tarih.BitisTarihi;
        }


        public Tarih IlkYukleme(Rota.RotaParcasi rota, int recderinlik, Tarih gelenTarih)
        {
            Rota.RotaParcasi RotaUstLimit=rota;
            Rota.RotaParcasi RotaEldeki = rota.EnUzunDal();
            DateTime EldekiSonTarih=gelenTarih.BaslangicTarihi;
            foreach (Rota.Operasyon op in RotaEldeki.OperasyonList)
            {
                IsParcasi donenIsparcasi = Cizelge.ParcaEkle(cizelge, op, EldekiSonTarih, null, recderinlik, grupNo, siparisBilgi);
                EldekiSonTarih = donenIsparcasi.BitTarihi;
            }
            recderinlik++;
            //##
            Tarih ayniSeviyeBitTarih = new Tarih(gelenTarih.BaslangicTarihi, EldekiSonTarih);
            //Aynı seviyedeki rota parçalarını yüklemede bitiş tarihi önemidir ancak başlangıç tarihi de geri yükleme için bi kısıt olacaktır.
            //##
            ayniSeviyeBitTarih = AyniSeviyedekiDallariYukle(RotaEldeki,recderinlik, ayniSeviyeBitTarih);
            recderinlik++;
            Tarih ustTarih=new Tarih();
            ustTarih.BaslangicTarihi=ayniSeviyeBitTarih.BitisTarihi;
            UstYukle(RotaEldeki, RotaUstLimit,recderinlik, ustTarih);
            Tarih tumTarih = new Tarih(gelenTarih.BaslangicTarihi, ustTarih.BitisTarihi);
            return tumTarih;
        }
        //bu çalıştırılmıyor
        //public Tarih IlkYukleme(Rota.Operasyon operasyon, int recderinlik, Tarih gelenTarih)
        //{
        //    Rota.Operasyon OperasyonUstLimit = operasyon;
        //    Rota.RotaParcasi RotaEldeki = operasyon.EnUzunDal();
        //    DateTime EldekiSonTarih = gelenTarih.BaslangicTarihi;
        //    foreach (Rota.Operasyon op in RotaEldeki.OperasyonList)
        //    {
        //        IsParcasi donenIsparcasi = Cizelge.ParcaEkle(cizelge, op, EldekiSonTarih, null, recderinlik, grupNo, siparisBilgi);
        //        EldekiSonTarih = donenIsparcasi.BitTarihi;
        //    }
        //    recderinlik++;
        //    //##
        //    Tarih ayniSeviyeBitTarih = new Tarih(gelenTarih.BaslangicTarihi, EldekiSonTarih);
        //    //Aynı seviyedeki rota parçalarını yüklemede bitiş tarihi önemidir ancak başlangıç tarihi de geri yükleme için bi kısıt olacaktır.
        //    //##
        //    ayniSeviyeBitTarih = AyniSeviyedekiDallariYukle(RotaEldeki, recderinlik, ayniSeviyeBitTarih);
        //    recderinlik++;
        //    Tarih ustTarih = new Tarih();
        //    ustTarih.BaslangicTarihi = ayniSeviyeBitTarih.BitisTarihi;
        //    UstYukle(RotaEldeki, OperasyonUstLimit, recderinlik, ustTarih);
        //    Tarih tumTarih = new Tarih(gelenTarih.BaslangicTarihi, ustTarih.BitisTarihi);
        //    return tumTarih;
        //}

        private void UstYukle(Rota.RotaParcasi rotaBulundugu, Rota.AbstractRota EnUstLimit, int recDerinlik, Tarih gelenTarih)
        {
            //Gelen Tarih yukarıya göre başlangıç en son biten oldu
            Rota.Operasyon SuankiOp = rotaBulundugu.Ust;
            
            List<Rota.Operasyon> UstundekiOpList = SuankiOp.UstundekiOpList;
            DateTime sonBitisTarihi = gelenTarih.BaslangicTarihi;
            
            recDerinlik++;
            IsParcasi isParca = Cizelge.ParcaEkle(cizelge, SuankiOp, gelenTarih.BaslangicTarihi, null, recDerinlik, grupNo, siparisBilgi);
            DateTime EldekiSonTarih = isParca.BitTarihi;

            foreach (Rota.Operasyon op in UstundekiOpList)
            {
                recDerinlik++;
                IsParcasi isParcaUst = Cizelge.ParcaEkle(cizelge, op, EldekiSonTarih, null, recDerinlik, grupNo, siparisBilgi);
                EldekiSonTarih = isParcaUst.BitTarihi;
                gelenTarih.BitisTarihi = EldekiSonTarih;
            }

            if (rotaBulundugu.Ust.Rota.Equals(EnUstLimit))
            {
                return;
            }
            else
            {
                recDerinlik++;
                Tarih sonTarih = new Tarih();
                sonTarih.BaslangicTarihi = this.siparisBilgi.TarihBilgisi.BaslangicTarihi;
                sonTarih.BitisTarihi=EldekiSonTarih;
                Tarih seviyeTarihi = AyniSeviyedekiDallariYukle(SuankiOp.Rota, recDerinlik, sonTarih);
                recDerinlik++;
                Tarih ustTarih = new Tarih();
                ustTarih.BaslangicTarihi = seviyeTarihi.BitisTarihi;
                UstYukle(SuankiOp.Rota, EnUstLimit, recDerinlik, ustTarih);
            }
            
        }

        private Tarih AyniSeviyedekiDallariYukle(Rota.RotaParcasi rota, int recDerinlik, Tarih gelenTarih)
        {
            List<Rota.RotaParcasi> AyniSeviyedekiList = rota.Ust.AltParca.Where<Rota.RotaParcasi>(p => p != rota).ToList<Rota.RotaParcasi>();
            Tarih sonTarih = new Tarih();
            sonTarih.BaslangicTarihi = gelenTarih.BaslangicTarihi;
            sonTarih.BitisTarihi = gelenTarih.BitisTarihi;
            foreach (Rota.RotaParcasi rp in AyniSeviyedekiList)
            {
                Tarih t = new Tarih(siparisBilgi.TarihBilgisi.BaslangicTarihi, gelenTarih.BitisTarihi);
                //Tarih t = new Tarih(gelenTarih.BitisTarihi, gelenTarih.BaslangicTarihi);
                GeriYukle geriYukleme = new GeriYukle(cizelge, t, rp, siparisBilgi);
                geriYuklemeler.Add(geriYukleme);
                if (geriYukleme.IsYuklendi)
                {
                    //GeriYukleme otomatik kaydedildi
                }
                else
                {
                    //GeriYukleme otomatik geri alındı
                    recDerinlik++;
                    //Geri yükleme başarısız ileri yükle
                    Tarih donenTarih = IlkYukleme(rp,recDerinlik,gelenTarih);
                    if (donenTarih.BitisTarihi > sonTarih.BitisTarihi)
                    { sonTarih.BitisTarihi = donenTarih.BitisTarihi; }
                }
            }
            return sonTarih;
        }

        private void GeriAl()
        {
            foreach (GeriYukle item in geriYuklemeler)
            {
                item.GeriAl();
            }
            cizelge.GeriAl(null, grupNo);
        }

        
    }
}
